package org.cybzacg.convert.enums;

import lombok.Getter;

/**
 * 转换策略枚举
 * 定义不同的转换策略
 *
 * @author cybzacg.blog
 * @version 3.0
 * @since 3.0
 */
@Getter
public enum ConversionStrategyEnum {

    /**
     * 严格模式转换
     * 类型必须完全匹配，否则抛出异常
     */
    STRICT("Strict", "严格模式", "类型必须完全匹配，否则抛出异常"),

    /**
     * 宽松模式转换
     * 允许类型兼容性转换，失败时返回默认值
     */
    LENIENT("Lenient", "宽松模式", "允许类型兼容性转换，失败时返回默认值"),

    /**
     * 安全模式转换
     * 优先使用默认值，避免异常
     */
    SAFE("Safe", "安全模式", "优先使用默认值，避免异常"),

    /**
     * 性能优先模式
     * 优化转换性能，可能牺牲一些准确性
     */
    PERFORMANCE("Performance", "性能优先", "优化转换性能，可能牺牲一些准确性"),

    /**
     * 兼容模式
     * 最大程度兼容各种类型转换
     */
    COMPATIBLE("Compatible", "兼容模式", "最大程度兼容各种类型转换"),

    /**
     * 自定义模式
     * 使用自定义转换逻辑
     */
    CUSTOM("Custom", "自定义模式", "使用自定义转换逻辑");

    private final String code;
    private final String name;
    private final String description;

    ConversionStrategyEnum(String code, String name, String description) {
        this.code = code;
        this.name = name;
        this.description = description;
    }

    /**
     * 根据代码获取转换策略
     *
     * @param code 策略代码
     * @return 转换策略
     */
    public static ConversionStrategyEnum fromCode(String code) {
        if (code == null) {
            return SAFE; // 默认安全模式
        }

        for (ConversionStrategyEnum strategy : values()) {
            if (strategy.getCode().equalsIgnoreCase(code) ||
                strategy.name().equalsIgnoreCase(code)) {
                return strategy;
            }
        }

        return SAFE;
    }

    /**
     * 检查是否为严格模式
     *
     * @return 是否为严格模式
     */
    public boolean isStrict() {
        return this == STRICT;
    }

    /**
     * 检查是否为宽松模式
     *
     * @return 是否为宽松模式
     */
    public boolean isLenient() {
        return this == LENIENT;
    }

    /**
     * 检查是否为安全模式
     *
     * @return 是否为安全模式
     */
    public boolean isSafe() {
        return this == SAFE;
    }

    /**
     * 检查是否为性能优先模式
     *
     * @return 是否为性能优先模式
     */
    public boolean isPerformance() {
        return this == PERFORMANCE;
    }

    /**
     * 检查是否为兼容模式
     *
     * @return 是否为兼容模式
     */
    public boolean isCompatible() {
        return this == COMPATIBLE;
    }

    /**
     * 检查是否为自定义模式
     *
     * @return 是否为自定义模式
     */
    public boolean isCustom() {
        return this == CUSTOM;
    }

    @Override
    public String toString() {
        return String.format("%s - %s: %s", code, name, description);
    }
}
